package main

import (
	"fmt"
	"sync"
)

// 并行和并发
// 解释一：并行是指两个或者多个事件在同一时刻发生；而并发是指两个或多个事件在同一时间间隔发生。
// 解释二：并行是在不同实体上的多个事件，并发是在同一实体上的多个事件。
// 解释三：并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群，并发是在一台处理器上“同时”处理多个任务。

// 线程和进程
// 调度：线程作为调度和分配的基本单位，进程作为拥有资源的基本单位
// 并发性：不仅进程之间可以并发执行，同一个进程的多个线程之间也可并发执行
// 拥有资源：进程是拥有资源的一个独立单位，线程不拥有系统资源，但可以访问隶属于进程的资源.
// 系统开销：在创建或撤消进程时，由于系统都要为之分配和回收资源，导致系统的开销明显大于创建或撤消线程时的开销。
// 一个线程只可以属于一个进程，一个进程可以包含多个进程

// goroutine是一个在语言层面实现的轻量级线程

var wg sync.WaitGroup

func hello(i int) {
	fmt.Println("hello，娜扎", i)
	wg.Done() // 通知wg把计数器 —1
}
func main() { // 开启一个主goroutine 去执行main函数
	wg.Add(10) // 计数牌 + 1,也就是开启了10个协程同时并发工作，是无序的
	for i := 0; i <= 10; i++ {
		go hello(i) // 开启了一个goroutine去执行hello这个函数
	}
	fmt.Println("hello,main")
	// time.Sleep(time.Second)
	wg.Wait() // 阻塞，等所有小弟都干完活才收兵

}

// 以上是开启多个goroutine，使用sync管理
//匿名函数一样可以使用，将hello()函数去掉即可执行
